package com.vip.jwt.common.utils.sign;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.vip.jwt.common.utils.xcx.Constants;
import org.springframework.util.ResourceUtils;

import javax.servlet.http.HttpServletRequest;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;

public class ZFBSignUtil {

    /**
     * 获取随机串
     * @return
     */
    public static String getNonceStr(){
        return RandomUtil.randomString(16);
    }

    /**
     * 签名算法（MD5或者HMAC-SHA256）
     * @return
     */
    public static String getSignType(){
        return Constants.MD5;
    }

    /**
     * 获取当前时间戳
     * @return
     */
    public static String getTimeStamp(){
        return String.valueOf(DateUtil.date().getTime()/1000);
    }

    /**
     * 商户订单号
     * @return
     */
    public static String getOutTradeNo(){
        String dateStr = DateUtil.format(DateUtil.date(),"yyyyMMddHHmmssSSS");
        String randomStr = RandomUtil.randomNumbers(5);
        return dateStr+randomStr;
    }

    /**
     * 验签（需要注意以下问题）
     *
     * 代码中支付宝公钥参数与开放平台上“接口加签方式”位置获取的支付宝公钥是否一致。
     * （大部分商户报错是由于支付宝公钥错误导致，需在开放平台的“接口加签方式”位置的支付宝公钥中获取，注意不是通过密钥生成工具生成的）
     * 使用工具生成的密钥为应用私钥和应用公钥，应用公钥与支付宝公钥数据不同。
     * 如果应用的“接口加签方式”设置为“公钥”，则获取支付宝公钥数据，使用支付宝公钥数据进行验签。
     * 如果应用的“接口加签方式”设置为“公钥证书”，则获取支付宝公钥证书信息，使用支付宝公钥证书进行验签。
     * @param params
     * @return
     */
    public static boolean rsaCheckV1(Map<String,String> params) throws FileNotFoundException, AlipayApiException {
        //注意：如果打jar包这里是获取不到路径的
        //解决方法：将证书放在本地，使用本地路径，例如："C:\\Users\\Administrator\\Desktop\\"
        String rootPath = ResourceUtils.getURL("classpath:").getPath();
        String alipayPublicCertPath = rootPath+"crt/alipayCertPublicKey_RSA2.crt";
        return AlipaySignature.rsaCertCheckV1(params, alipayPublicCertPath,"utf-8",Constants.RSA2);
    }

    /**
     * 在request中获取map
     * @param request
     * @return
     */
    public Map<String,String> requestToMap(HttpServletRequest request) {
        // 构造传入参数
        Map<String, String> params = new HashMap<>();
        Map<String, String[]> requestParams = request.getParameterMap();
        for (String name : requestParams.keySet()) {
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            }
            //如果出现乱码时使用
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }
        return params;
    }

}
